package com.berchen.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * 反射
 */
public class FanSheDemo {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        /**
         * 获取class对象的三种方式
         */
        Class<Person> personClass = Person.class;
        Person person = new Person();
        Class<Person> aClass = (Class<Person>) person.getClass();
        Class<?> aClass1 = Class.forName("com.berchen.test.Person");

        // 获取所有共有的方法
        aClass.getMethods();
        // 获取所有的方法  包括私有的
        aClass.getDeclaredMethods();
        // 获取public的构造器
        aClass.getConstructors();
        // 获取所有的构造器
        aClass.getDeclaredConstructors();
        Person person1 = aClass.getConstructor().newInstance();


        // 获取所有公共的的字段
        Field[] fields = aClass.getFields();
        for (Field field :fields){
            if(field.getName().equals("name")){

            }
        }

        // 获取所有方法包括私有的
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field field:declaredFields){
            field.setAccessible(true);  // 暴力访问
            if(field.getName().equals("name")) {
                field.set(person1, "陈");
            }
            if(field.getName().equals("phone")){
                field.set(person1,"15228366072");
            }
            System.out.println(field.get(person1));
        }
    }
}
class Person{

    public Person() {
    }

    private String name;
    public String phone;

    private void  test(){
        System.out.println("test private");
    }
    public void test1(){
        System.out.println("public test1");
    }
}
